home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 2003 June / macformat-130.iso / mac / Reviewed⁄Demos / Spearhead Demo / demota / pak1.pk3 / global / mg42_active.scr < prev    next >
Encoding:
Text File  |  2002-10-21  |  14.0 KB  |  514 lines

  1. ////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  MoH: Allied Assault Script File  
  4. //  Global function: MG42 routine for mounted machine guns with spotters
  5. //  Script Written By: Benson 'elmagoo' Russell, Robert Field
  6. //
  7. ////////////////////////////////////////////////////////////////////////////////////////
  8.  
  9. //*****************************************************************************************************************
  10. // self is the mg42 gun
  11. //*****************************************************************************************************************
  12. mg42 local.range:
  13.  
  14. //*** check to see if the gun exists
  15. if (self == NULL)
  16. {
  17.     println "^~^~^ MG42 turret does not exist!"
  18.     end
  19. }    
  20.  
  21. //println self " set in gun range: " self.max_range
  22.  
  23. if (local.range != NIL)
  24.     self.max_range = local.range
  25. else if (self.max_range == NIL)
  26.     self.max_range = 2400
  27.  
  28. //println self " range: " local.range
  29. //println self " in-set spawn value: " self.spawn
  30.  
  31. if (self.setplayerusable == NIL)
  32.     self.setplayerusable = 1
  33.  
  34. if (self.turnspeed == NIL)
  35.     self.turnspeed = 45
  36.  
  37. if (self.pitchcaps == NIL)
  38.     self.pitchcaps = ( -15 15 0)
  39.  
  40. if (self.maxyawoffset == NIL)
  41.     self.maxyawoffset = 45
  42.  
  43. self.firedelay = .1
  44.  
  45. if (self.bulletdamage == NIL)
  46.     self.bulletdamage = 70
  47.  
  48. if (self.tracerfrequency == NIL)
  49.     self.tracerfrequency = 3
  50.  
  51. /*
  52. println self " setplayerusable(1): " self.setplayerusable
  53. println self " turnspeed(45): " self.turnspeed
  54. println self " pitchcaps(-15 15 0): " self.pitchcaps
  55. println self " maxyawoffset(45): " self.maxyawoffset
  56. println self " firedelay(.06): " self.firedelay
  57. println self " bulletdamage(70): " self.bulletdamage
  58. println self " tracerfrequency(4): " self.tracerfrequency
  59. */
  60.  
  61. self setplayerusable self.setplayerusable
  62. self turnspeed self.turnspeed
  63. self pitchcaps self.pitchcaps
  64. self maxyawoffset self.maxyawoffset
  65. self firedelay self.firedelay
  66. self bulletdamage self.bulletdamage
  67. self tracerfrequency self.tracerfrequency
  68.  
  69. self.gunner = $(self.targetname + "_gunner")
  70. if (self.gunner != NULL)
  71.     thread mg42_gunner_death
  72.  
  73. self.spotter = $(self.targetname + "_spotter")
  74. if (self.spotter != NULL)
  75.     thread mg42_spotter_death
  76.  
  77. //*** create the center aim target script_origin for reloading
  78. //println self " spawning a center aim target"
  79. self.center = spawn script_origin
  80. self.temp_origin = (self.forwardvector * 128) + self.origin
  81. self.temp_origin[2] = self.origin[2]
  82. self.center.origin = self.temp_origin
  83.  
  84. //*** create a temp target for this gun for accuracy
  85. self.temp_target = spawn script_origin
  86. //println "MG42: spawned temp target: " self.temp_target
  87.  
  88. self.reload_counter = 0
  89. self.cover_time = 0
  90.  
  91. self.spawner_gunner = $(self.targetname + "_spawner_gunner")
  92.  
  93. if (self.spawner_gunner != NULL)
  94. {
  95.     if (self.spawner_gunner.path == NIL || self.spawner_gunner.path == "")
  96.     {
  97.         self.path_gunner = $(self.targetname + "_gunner_path")
  98.     }
  99.     else
  100.     {
  101.         self.path_gunner = $(self.spawner_gunner.path)
  102.     }
  103.  
  104.     if (self.spawner_gunner.ai_model == NIL || self.spawner_gunner.ai_model == "")
  105.     {
  106.         self.model_gunner = "models/human/german_wehrmact_grenadier"
  107.     }
  108.     else
  109.     {
  110.         self.model_gunner = ("models/human/" + self.spawner_gunner.ai_model)
  111.     }
  112. }
  113.  
  114. self.spawner_spotter = $(self.targetname + "_spawner_spotter")
  115.  
  116. if (self.spawner_spotter != NULL)
  117. {
  118.     if (self.spawner_spotter.path == NIL || self.spawner_spotter.path == "")
  119.     {
  120.         self.path_spotter = $(self.targetname + "_spotter_path")
  121.     }
  122.     else
  123.     {
  124.         self.path_spotter = $(self.spawner_spotter.path)
  125.     }
  126.  
  127.     if (self.spawner_spotter.ai_model == NIL || self.spawner_spotter.ai_model == "")
  128.     {
  129.         self.model_spotter = "models/human/german_wehrmact_grenadier"
  130.     }
  131.     else
  132.     {
  133.         self.model_spotter = ("models/human/" + self.spawner_spotter.ai_model)
  134.     }
  135. }
  136.  
  137. self.spawn_left = self.spawn
  138.  
  139. thread mg42_gunner_start
  140. thread mg42_spotter_start
  141.  
  142. wait 1
  143. if (self.gunner == NULL && self.spotter == NULL)
  144.     thread mg42_spawn
  145.  
  146. end
  147.  
  148. //*****************************************************************************************************************
  149. mg42_spawn:
  150.  
  151. if (self.spawn_left == NIL || self.spawn_left <= 0)
  152.     end
  153.  
  154. self.gunner = spawn self.model_gunner gun "mg42" ammo_grenade "5" origin self.spawner_gunner.origin
  155. thread mg42_gunner_death
  156.  
  157. if (self.spawner_spotter != NULL)
  158. {
  159.     self.spotter = spawn self.model_spotter gun "mauser kar 98k" ammo_grenade "5" origin self.spawner_spotter.origin
  160.     self.spotter exec global/disable_ai.scr
  161.     thread mg42_spotter_death
  162. }
  163.  
  164. self.spawn_left--
  165.  
  166. thread mg42_gunner_run
  167. if (isalive self.spotter)
  168.     thread mg42_spotter_run
  169. end
  170.  
  171.  
  172. //*****************************************************************************************************************
  173. mg42_gunner_run:
  174.  
  175. //println "gunner: " self.gunner " running on path: " self.path_gunner
  176.  
  177. self.gunner exec global/disable_ai.scr
  178. self.gunner exec global/runto.scr self.path_gunner
  179. self.gunner waittill movedone
  180. self.gunner exec global/enable_ai.scr
  181.  
  182. thread mg42_gunner_start
  183.  
  184. end
  185.  
  186. //*****************************************************************************************************************
  187. mg42_spotter_run:
  188.  
  189. //println "spotter: " self.spotter " running on path: " self.path_spotter
  190.  
  191. self.spotter exec global/runto.scr self.path_spotter
  192. self.spotter waittill movedone
  193.  
  194. thread mg42_spotter_start
  195.  
  196. end
  197.  
  198.  
  199. //*****************************************************************************************************************
  200. mg42_gunner_start:
  201.  
  202. if !(isalive self.gunner)
  203.     end
  204.  
  205. //*** turn the gunner into a machinegunner
  206. self.gunner type_idle machinegunner
  207. self.gunner type_attack machinegunner
  208. self.gunner type_disguise machinegunner
  209. self.gunner type_grenade machinegunner
  210. self.gunner turret self
  211. self.gunner health 5
  212. self.gunner exec global/setdeathanim.scr "death_fall_back"
  213. goto enable
  214.  
  215. //*****************************************************************************************************************
  216.  
  217. enable:
  218. if !(isalive self.gunner)
  219.     end
  220.  
  221. if (self.gunner_thread)
  222.     end
  223. self.gunner_thread = local
  224.  
  225. self.target_changed = 1
  226.  
  227. mg42_main_fireloop:
  228. if (!self.gunner.turret)
  229. {
  230.     if (IsAlive self.spotter)
  231.     {
  232.         self.spotter weapon_internal models/weapons/kar98.tik
  233.         self.spotter exec global/enable_ai.scr
  234.     }
  235.     end
  236. }
  237.  
  238. //*** check to see if the gun needs to reload
  239. if (self.reload_counter >= 13)
  240. {
  241. //    println self " reloading"
  242.     self stopfiring
  243.     self.isfiring = 0
  244.     self setaimtarget self.center
  245.  
  246.     wait .5
  247.     self.gunner reload_mg42
  248.     self.gunner waittill animdone
  249.     self.target_changed = 1
  250.  
  251.     self.reload_counter = 0
  252. //    println self " done reloading"
  253. }
  254.  
  255. //println self " setaimtarget: " self.setaimtarget
  256. //println self " current_target: " self.current_target
  257.  
  258. //*** if there is currently no target, make it the player
  259. if (self.setaimtarget == NIL || self.current_target == NIL || !(isalive self.setaimtarget) || !(isalive self.current_target))
  260. {
  261. //    println self " target was NIL, setting to player"
  262.     self.setaimtarget = $player
  263.     self stopfiring
  264.     self.isfiring = 0
  265.     self.target_changed = 1
  266. }
  267. else if (self.setaimtarget != self.current_target)
  268. {
  269.     self.target_changed = 1
  270. }
  271.  
  272. //*** If the target changed, have the spotter tap gunner on the head
  273. if (self.target_changed == 1)
  274. {
  275. //    println self " target was changed, stopping to switch to new target"
  276.     if (isalive self.spotter)
  277.         thread mg42_spotter_tap
  278.     // Set target_changed to 2 so the gunner knows to respond next loop.
  279.     self.target_changed = 2
  280. }
  281. //*** When you get tapped on the head, fire at the new target
  282. else if (self.target_changed == 2)
  283. {
  284.     self startfiring
  285.     self.isfiring = 1
  286.     
  287.     // Reset the target_changed variable now we're done with it.
  288.     self.target_changed = 0
  289. }
  290.  
  291. self.current_target = self.setaimtarget
  292.  
  293. //*** check distance and line of sight to target, if outside distance or not visible, stop firing
  294. if !(self.gunner cansee self.current_target (self.maxyawoffset * 2) self.max_range)
  295. {
  296. //        println self " can't see it's current target: " self.current_target
  297.     wait self.cover_time
  298.     self stopfiring
  299.     self setaimtarget NULL
  300.     self.isfiring = 2    // 2 to represent "wants to fire"
  301.     wait .5
  302.     goto mg42_main_fireloop
  303. }
  304. else
  305. {
  306.     if (!self.player_enemy && (self.current_target == $player))
  307.     {
  308.         //*** check to see if the player is disguised
  309.         if ($player.is_disguised == 1)
  310.         {
  311.             self stopfiring
  312.             self setaimtarget NULL
  313.             wait .5
  314.             goto mg42_main_fireloop
  315.         }
  316.         self.player_enemy = 1
  317.     }
  318.  
  319.     if (self.isfiring == 2)
  320.     {
  321. //            println "MG42: wait time to start firing again: " self.cover_time
  322.         wait self.cover_time
  323.         self startfiring
  324.         self.isfiring = 1
  325.     }
  326. }
  327.  
  328. //println self " has target: " self.current_target
  329.  
  330. //*** do a range check and set the accuracy accordingly
  331. local.distance = vector_length (self.origin - self.current_target.origin)
  332.  
  333. //println "MG42: range to target: " self.current_target " : is: " local.distance
  334.  
  335. if (local.distance >= 2401)
  336. {
  337.     //*** calculate a point that's offset from the current target
  338.     local.xoffset = (randomint 321 - 160)
  339.     local.yoffset = (randomint 321 - 160)
  340.     local.zoffset = (randomint 185 - 92)
  341.     self.temp_origin = ( (self.current_target.origin[0] + local.xoffset) (self.current_target.origin[1] + local.yoffset) ((self.current_target.origin[2] + local.zoffset) + 48) )
  342.     
  343.     //*** set the temp targets origin to the offset origin
  344.     self.temp_target.origin = self.temp_origin
  345.     
  346.     //*** set the wait time for if the player goes behind cover
  347.     self.cover_time = 1.5
  348.     
  349.     //*** make the gun shoot at that
  350.     self setaimtarget self.temp_target
  351. }
  352. else if (local.distance >= 1801)
  353. {
  354.     //*** calculate a point that's offset from the current target
  355.     local.xoffset = (randomint 297 - 148)
  356.     local.yoffset = (randomint 297 - 148)
  357.     local.zoffset = (randomint 145 - 72)
  358.     self.temp_origin = ( (self.current_target.origin[0] + local.xoffset) (self.current_target.origin[1] + local.yoffset) ((self.current_target.origin[2] + local.zoffset) + 48) )
  359.  
  360.     //*** set the temp targets origin to the offset origin
  361.     self.temp_target.origin = self.temp_origin
  362.  
  363.     //*** set the wait time for if the player goes behind cover
  364.     self.cover_time = 1
  365.     
  366.     //*** make the gun shoot at that
  367.     self setaimtarget self.temp_target
  368. }
  369. else if (local.distance >= 1201)
  370. {
  371.     //*** calculate a point that's offset from the current target
  372.     local.xoffset = (randomint 185 - 92)
  373.     local.yoffset = (randomint 185 - 92)
  374.     local.zoffset = (randomint 65 - 32)
  375.     self.temp_origin = ( (self.current_target.origin[0] + local.xoffset) (self.current_target.origin[1] + local.yoffset) ((self.current_target.origin[2] + local.zoffset) + 48) )
  376.  
  377.     //*** set the temp targets origin to the offset origin
  378.     self.temp_target.origin = self.temp_origin
  379.     
  380.     //*** set the wait time for if the player goes behind cover
  381.     self.cover_time = .5
  382.  
  383.     //*** make the gun shoot at that
  384.     self setaimtarget self.temp_target
  385. }
  386. else if (local.distance >= 501)
  387. {
  388.     //*** calculate a point that's offset from the current target
  389.     local.xoffset = (randomint 65 - 32)
  390.     local.yoffset = (randomint 65 - 32)
  391.     local.zoffset = (randomint 33 - 16)
  392.     self.temp_origin = ( (self.current_target.origin[0] + local.xoffset) (self.current_target.origin[1] + local.yoffset) ((self.current_target.origin[2] + local.zoffset) + 48) )
  393.  
  394.     //*** set the wait time for if the player goes behind cover
  395.     self.cover_time = .25
  396.     
  397.     //*** set the temp targets origin to the offset origin
  398.     self.temp_target.origin = self.temp_origin
  399.     
  400.     //*** make the gun shoot at that
  401.     self setaimtarget self.temp_target
  402. }
  403. else if (local.distance < 500)
  404. {
  405.     //*** set the wait time for if the player goes behind cover
  406.     self.cover_time = .25
  407.  
  408.     self setaimtarget self.current_target
  409. }
  410.  
  411. if (self.isfiring == 1)
  412. {
  413.     self.reload_counter++
  414. }
  415.  
  416. /*
  417.     println "MG42: xoffset: " local.xoffset
  418.     println "MG42: yoffset: " local.yoffset
  419.     println "MG42: zoffset: " local.zoffset
  420.     println "MG42: temp_targets origin: " self.temp_target.origin
  421.     println "MG42: current_targets origin: " self.current_target.origin
  422. */
  423.  
  424. wait .5
  425. goto mg42_main_fireloop
  426.  
  427.  
  428. //*****************************************************************************************************************
  429. mg42_spotter_tap:
  430.  
  431. //println "MG42 SPOTTER TAP: executing tap"
  432.  
  433. if (self.current_target != NIL)
  434. {
  435.     if (((self.current_target.origin - self.origin) * self.leftvector) >= 0)
  436.     {
  437.         //*** point left and tap
  438.     //    println "MG42 SPOTTER TAP: " self.spotter " spotter pointing left"
  439.         self.spotter anim MG42_spotter_stand_left
  440.     }
  441.     else
  442.     {
  443.         //*** point right and tap
  444.     //    println "MG42 SPOTTER TAP: " self.spotter " spotter pointing right"
  445.         self.spotter anim MG42_spotter_stand_right
  446.     }
  447. }
  448.  
  449. end
  450.  
  451. //*****************************************************************************************************************
  452.  
  453. mg42_spotter_start:
  454.  
  455. //println "MG42 SPOTTER SETUP: spotter at the weapon" 
  456.  
  457. //println "MG42 SPOTTER SETUP: spotter: " self.spotter " has reached the weapon"
  458.  
  459. if !(isalive self.spotter)
  460.     end
  461.  
  462. //    println "MG42 SPOTTER SETUP: " self.spotter " is alive, disabling and telling the weapon"
  463. self.spotter exec global/disable_ai.scr
  464. self.spotter holster
  465.  
  466. end
  467.  
  468.  
  469. //*****************************************************************************************************************
  470. mg42_gunner_death:
  471. self.gunner waittill death
  472.  
  473. if (self.gunner_thread)
  474.     self.gunner_thread delete
  475.  
  476. if !(isalive self.spotter)
  477. {
  478.     wait 2
  479.     thread mg42_spawn
  480. }
  481. else
  482. {
  483. //    println self.gunner " waking up the spotter"
  484.     self.spotter type_idle idle
  485.     self.spotter type_attack cover
  486.     self.spotter exec global/enable_ai.scr
  487.     self.spotter unholster
  488.     self.spotter attackplayer
  489. }
  490.  
  491. end
  492.  
  493.  
  494. //*****************************************************************************************************************
  495. mg42_spotter_death:
  496. self.spotter waittill death
  497.  
  498. if !(isalive self.gunner)
  499. {
  500.     wait 2
  501.     thread mg42_spawn
  502. }
  503.  
  504. end
  505.  
  506. //*****************************************************************************************************************
  507.  
  508. disable:
  509. if (self.gunner_thread)
  510.     self.gunner_thread delete
  511. self stopfiring
  512. self setaimtarget NULL
  513. end
  514.